package model.pieces;

import model.memento.ManUndoableEdit;
import model.memento.Movement;
import model.memento.MovementDirection;

public class Man extends Piece {
	
	/**
	 * @param x <-> col
	 * @param y <-> row
	 */
	public Man(int x, int y) {
		super(x, y);
	}
	
	/**
	 * @see model.pieces.Piece#canMove()
	 */
	@Override
	public boolean canMove() {
		return true;
	}
	
	/**
	 * mover hombre en la direccion indicada
	 * @param direction
	 */
	public void move(MovementDirection direction) {
		// Dejo la posicion actual, lo notifico a los Target para que se desocupen.
		this.mediator.leavePosition(this, this.col, this.row);
		// Movimiento a realizar.
		Movement move = new Movement(direction, this.col, this.row);
		setPosition(move);
		// notificar memento
		addMoveToMemento(direction);		
		// Notifico a todas las piezas para que protesten si ocupo su lugar y no lo permite.
		this.mediator.requestMultiMovement(this, move);
		// termino de editar memento
		this.mementoSupport.endUpdate();
	}
	
	private void addMoveToMemento(MovementDirection direction) {
		// inicio nuevo grupo de movimientos
		this.mementoSupport.beginUpdate();
		this.mementoSupport.postEdit(new ManUndoableEdit(this, direction));
	}
	
	/**
	 * @see model.pieces.Piece#refuseMovement(model.memento.Movement)
	 */
	@Override
	public void refuseMovement(Movement move) {
		if (move.isMovementPosition(col, row)) {
			// Deshacer el movimiento realizado porque una pieza ha protestado
			Movement backMove = move.getBackMovement();
			setPosition(backMove);
			this.mediator.refuseMovement(this, backMove);
			// Destruir la informacion del memento
			this.mementoSupport.die();
		}
	}
}
